"""
测试Log_Utils功能
"""

import os
import tempfile
import shutil
from com.tools.Log_Utils import LogUtils


def test_log_utils():
    """
    测试日志工具类
    """
    # 创建临时目录用于测试
    temp_dir = tempfile.mkdtemp()
    print(f"使用临时目录进行测试: {temp_dir}")
    
    try:
        # 测试创建简单日志记录器
        print("\n测试创建简单日志记录器:")
        simple_logger = LogUtils.create_simple_logger("simple_test")
        simple_logger.info("简单日志记录器测试")
        simple_logger.warning("这是一条警告信息")
        simple_logger.error("这是一条错误信息")
        
        # 测试自定义格式
        print("\n测试自定义格式:")
        custom_logger = LogUtils(
            name="custom_test",
            level="DEBUG",
            log_format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
        ).add_console_handler()
        
        custom_logger.debug("调试信息")
        custom_logger.info("一般信息")
        
        # 测试文件输出
        print("\n测试文件输出:")
        log_file = os.path.join(temp_dir, "test.log")
        file_logger = LogUtils.create_file_logger("file_test", log_file)
        file_logger.info("文件日志测试")
        file_logger.warning("文件警告测试")
        file_logger.error("文件错误测试")
        
        # 验证日志文件是否存在
        assert os.path.exists(log_file), "日志文件未创建"
        print(f"日志文件已创建: {log_file}")
        
        # 读取并验证日志文件内容
        with open(log_file, 'r', encoding='utf-8') as f:
            content = f.read()
            assert "文件日志测试" in content, "日志内容未正确写入文件"
            print("日志文件内容验证通过")
        
        # 测试动态修改配置
        print("\n测试动态修改配置:")
        dynamic_logger = LogUtils("dynamic_test")
        dynamic_logger.add_console_handler()
        dynamic_logger.info("修改前的日志")
        
        # 修改日志级别
        dynamic_logger.set_level("DEBUG")
        dynamic_logger.debug("修改级别后的调试日志")
        
        # 修改日志格式
        dynamic_logger.set_format(
            log_format="%(levelname)s: %(message)s"
        )
        dynamic_logger.info("修改格式后的信息日志")
        
        # 测试不同级别的日志记录
        print("\n测试不同级别的日志记录:")
        level_logger = LogUtils.create_simple_logger("level_test")
        level_logger.debug("DEBUG消息")
        level_logger.info("INFO消息")
        level_logger.warning("WARNING消息")
        level_logger.error("ERROR消息")
        level_logger.critical("CRITICAL消息")
        
        # 测试通用log方法
        level_logger.log("INFO", "使用log方法的消息")
        
        # 测试异常日志记录
        print("\n测试异常日志记录:")
        exception_logger = LogUtils.create_simple_logger("exception_test")
        try:
            result = 1 / 0
        except ZeroDivisionError:
            exception_logger.exception("发生除零异常")
        
        # 测试预设配置方法
        print("\n测试预设配置方法:")
        # get_logger方法
        custom_logger2 = LogUtils.get_logger(
            name="preset_test",
            level="INFO",
            log_format="%(asctime)s - %(message)s"
        ).add_console_handler()
        custom_logger2.info("预设配置测试")
        
        # 测试文件轮转
        print("\n测试文件轮转:")
        rotating_log_file = os.path.join(temp_dir, "rotating.log")
        rotating_logger = LogUtils("rotating_test").add_file_handler(
            rotating_log_file,
            max_bytes=1024,  # 很小的大小以测试轮转
            backup_count=3
        )
        
        # 写入大量日志以触发轮转
        for i in range(100):
            rotating_logger.info(f"轮转测试日志消息 {i}: " + "A" * 50)
        
        print("文件轮转测试完成")
        
        # 测试时间轮转
        print("\n测试时间轮转:")
        timed_log_file = os.path.join(temp_dir, "timed.log")
        timed_logger = LogUtils("timed_test").add_timed_rotating_file_handler(
            timed_log_file,
            when="S",  # 每秒轮转，用于测试
            interval=1,
            backup_count=3
        )
        
        timed_logger.info("时间轮转测试消息")
        print("时间轮转测试完成")
        
        print("\n所有测试通过!")
        
    finally:
        # 清理临时目录
        shutil.rmtree(temp_dir)
        print(f"\n已清理临时目录: {temp_dir}")


if __name__ == "__main__":
    test_log_utils()